/*
试题 基础练习 阶乘计算
     
资源限制
	内存限制：512.0MB   C/C++时间限制：1.0s   Java时间限制：3.0s   Python时间限制：5.0s

问题描述
　　输入一个正整数n，输出n!的值。
　　其中n!=1*2*3*…*n。

算法描述
　　n!可能很大，而计算机能表示的整数范围有限，需要使用高精度计算的方法。使用一个数组A来表示一个大整数a，A[0]表示a的个位，A[1]表示a的十位，依次类推。
　　将a乘以一个整数k变为将数组A的每一个元素都乘以k，请注意处理相应的进位。
　　首先将a设为1，然后乘2，乘3，当乘到n时，即得到了n!的值。

输入格式
　　输入包含一个正整数n，n<=1000。

输出格式
　　输出n!的准确值。

样例输入
	10

样例输出
	3628800
*/


/*----------------------------------------------------------------------------------------------------------------------------------------*/
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

//整型转成一个数组,数组每个元素为整型的每一个数位
vector<int> i_to_vector(int x)
{
	vector<int> ret;
	while (x){
		ret.push_back(x % 10);
		x /= 10;
	}
	reverse(ret.begin(), ret.end());
	return ret;
}

// 模拟乘法
vector<int> analog_multiplication(const vector<int>& x, const vector<int>& y)
{
	vector<vector<int>> matrix;						//存放部分积
	for (int i = y.size() - 1; i >= 0; i--){
		int carry = 0;								//进位(开始时为0)
		vector<int> middle_item;					//中间项
		for (int j = x.size() - 1; j >= 0; j--){
			int tmp = x[j] * y[i] + carry;
			int bit = tmp % 10;
			middle_item.push_back(bit);				//这里的中间项是反着的
			carry = tmp / 10;
		}
		if (carry != 0)								//最后进位可能不为0, 要加上!!!
			middle_item.push_back(carry);
		matrix.push_back(middle_item);
	}
	int row = matrix.size();
	int col = matrix[row - 1].size() + row - 1;		//建立一个二维数组, 方便错位相加
	vector<vector<int>> partial_product;			//前后补上0的部分积, 方便相加
	for (int i = 0; i < row; i++){
		vector<int> tmp;
		for (int j = 0; j < i; j++)					//第0行补上0个0, 第1行补上1个0,以此类推
			tmp.push_back(0);
		for (int j = 0; j < matrix[i].size(); j++)
			tmp.push_back(matrix[i][j]);
		while(tmp.size() < col)
			tmp.push_back(0);						//若不够列数还要补0
		partial_product.push_back(tmp);
	}

	vector<int> ret;								//部分积相加的结果
	int carry = 0;									//进位
	for (int i = 0; i < col; i++){
		int sum = 0;
		for (int j = 0; j < row; j++)
			sum += partial_product[j][i];			//每列求和
		sum += carry;
		int bit = sum % 10;
		ret.push_back(bit);
		carry = sum / 10;
	}
	if (carry != 0)									//进位不为0要补上!!!
		ret.push_back(carry);
	while (ret[ret.size() - 1] == 0)				//将后面多余的0去除
		ret.pop_back();
	reverse(ret.begin(), ret.end());				//在计算时,我们表示的数是反着的, 这里需要逆置,该函数需要头文件#include<algorithm>
	return ret;
}

int main()
{
	int n;
	cin >> n;
	//n小于10直接计算
	if (n <= 10){
		int factor = 1;
		for (int i = 1; i <= n; i++)
			factor *= i;
		cout << factor << endl;
	}
	else{
		int factor1 = 1;
		int i = 1;
		while (i <= 10){
			factor1 *= i;
			i++;
		}
		vector<int> factor2 = i_to_vector(factor1);
		while (i <= n){
			factor2 = analog_multiplication(factor2, i_to_vector(i));
			i++;
		}
		for (i = 0; i < factor2.size(); i++){
			cout << factor2[i];
		}
		cout << endl;
	}
	return 0;
}
/*----------------------------------------------------------------------------------------------------------------------------------------*/